Spring Cloud—八、使用Feign实现声明式的Rest调用

Author Avatar
zuoqy 12月 03, 2018
  • 在其它设备中阅读本文章

8.1、分析

之前我们通过RestTemplate调用Rest服务,代码是这样的:
虽然使用了Ribbon和Hystrix可以实现负载均衡和容错处理,但是这个编码在实现大量业务时会显得太过于冗余(如,多参数得URL拼接)。

8.2、Feign简介

官网:https://github.com/OpenFeign/feign

Feign是一个Netflix开发得声明式、模块化得HTTP客户端,其灵感来自Retrofit、JAXRS-2.0以及WebSocket。Feign可以帮助我们更加便捷、优雅地调用HTTP API。

在Spring Cloud中,使用Feign非常简单————创建一个接口,并在接口上添加一些注解,代码就完成了。Feign支持多种注解,例如Feign自带的注解或者JAX-RS注解等。

Spring Cloud对Feign进行了增强,使Feign支持了Spring MVC注解,并整合了Ribbon和Eureka,从而让Feign的使用更加方便。

8.3、快速入门

在订单微服务中增加Feign的支持。

8.3.1、导入依赖
1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>

8.3.2、创建一个ItemFeignClient接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 package cn.zuoqy.springclouddemoorder.feign;

import cn.zuoqy.springclouddemoorder.model.Item;

import [org.springframework.cloud.netflix.feign](http://org.springframework.cloud.netflix.feign/).FeignClient;

import org.springframework.web.bind.annotation.PathVariable;

import org.springframework.web.bind.annotation.RequestMapping;

/**

* Created by zuoqy on 17:24 2018/10/26.

*/

@FeignClient(value = "springcloud-demo-item")//声明这是一个Feign客户端,并且指明服务器id

public interface ItemFeignClient {

    // 这里定义了类似于SpringMvc用法的方法,就可以进行Restful的调用了

    @RequestMapping(value = "/item/query/{id}", method=RequestMethod.GET)

    public Item queryItemById(@PathVariable("id") Long id);

}
8.3.3、改造ItemService

ItemService.png

8.3.4、在启动类中添加@EnableFeignClients注解

启动类.png

8.3.5、重启测试

重启测试.png
测试结果,一切正常。

8.4、流程分析

1、由于我们在入口@EnableFeignClients注解,Spring启动后会扫描标注了@FeignClient注解的接口,然后生成代理类。

2、我们在@FeignClient接口中指定了value,其实就是指定了在Eureka中的服务名称

3、在FeignClient中定义方法以及使用了Spring Mvc的注解,Feign就会根据注解中的内容生成对应的url,然后基于Ribbon的负载均衡去调用REST服务

  • a)、为什么使用的是SpringMVC的注解?
    i.其实,Feign是有自己的注解的,是因为SpringCloud对Feign做了增强,兼容了SpringMVC的注解,使我们的学习成本更低
    
    i  png
    ii.专业的解释是这样的:
     [org.springframework.cloud.netflix.feign.FeignClientsConfiguration](http://org.springframework.cloud.netflix.feign.feignclientsconfiguration/)
     ![ii.png](/img/post/2018/070.png)
    
    设置默认的契约是SpringMVC契约

8.5、Feign的多参数构造

多参数构造.png


出自:zuoqy博客
如若转载请注明出处!